
#include <iostream>
#include <cassert>
#include <fstream>
#include "geometry.h"
#include "fluid.h"
#include "boundConds.h"
#include "spaceDiscr.h"
#include "timeDiscr.h"
#include "solver.h"
// 应该写成单元测试的样子  保证调试好弄
// g++17 ../src/test_main.cpp ../src/geometry.cpp
// g++17 ../src/test_main.cpp ../src/geometry.cpp ../src/fluid.cpp ../src/boundConds.cpp
// clang++17 ../src/test_main.cpp ../src/geometry.cpp ../src/fluid.cpp ../src/boundConds.cpp ../src/spaceDiscr.cpp ../src/timeDiscr.cpp  ../src/solver.cpp  ../src/utility.cpp
using namespace std;
// 是循环依赖的问题
int main()
{
	// string checkfname{"checkoutCpp"};
	// string checkcv{"checkcv"};
	// string checktimen{"checktime"};
	// string checkdissfn{"checkdiss"};
	// string checkfluxfn{"checkfluxroe1"};
	// ofstream checkFile{checkfname, ios_base::out};
	// ofstream checkCV{checkcv,ios_base::out};
	// ofstream checktime{checktimen,ios_base::out};
	// ofstream checkdiss{checkdissfn, ios_base::out};
	// ofstream checkfluxroe1{checkfluxfn, ios_base::out};
	// 测试boundcut 是否正确
	Config cfg;
	// 读边界文件 网格文件 计算几何量,
	Geometry geometric(cfg);
	geometric.PrintBoundary(cout);
	geometric.InitMetrics();
	// printCheck(checkFile, geometric.si,
	// 		   0, geometric.imax, 0, geometric.jmax);
	// // printArray(cout, geometric.si, "si");

	Fluid flow(cfg, geometric.imax, geometric.jmax);
	// flow.Print();
	flow.InitFlow();
	// VarArray<ConsVar_t, 2, 0> &cv = flow.GetCV();
	// for (int j = 0; j <= geometric.jmax; ++j)
	// 	for (int i = 0; i <= geometric.imax; ++i)
	// 	{
	// 		cv(i, j).rho = 1.0;
	// 		cv(i, j).rhou = 100.0;
	// 		cv(i, j).rhov = 400.0;
	// 		cv(i, j).rhoE = 40000.0;
	// 	}
	// for (int j = 2; j <= geometric.j2; ++j)
	// 	for (int i = 2; i <= geometric.i2; ++i)
	// 	{
	// 		cv(i, j).rho = 20.0;
	// 		cv(i, j).rhou = 300.0;
	// 		cv(i, j).rhov = 200.0;
	// 		cv(i, j).rhoE = 9.0E+4;
	// 	}
	// flow.DependentVarsAll();
	// printArray(cout, flow.dvN, "initail dvN");
	//     cout << "\nokay2\n"
	//          << endl;
	// BoundConds boundary(cfg, geometric, flow);
	// boundary.BoundaryConditions(); // 没问题
	// printCheck(checkCV, flow.GetCV(),
	// 		   0, geometric.imax, 0, geometric.jmax);
	// printArray(cout, flow.cv, " after bound set cv =");
	//     cout << "\nokay3\n"
	//          << endl;
	// SpaceDiscr spaceDiscrete(cfg, geometric, flow);
	// TimeDiscr tadv(cfg, geometric,
	// 			   flow, spaceDiscrete,
	// 			   boundary);

	// VarArray<ConsVar_t, 2, 0> &cv = flow.GetCV();
	// for (int j = 0; j <= geometric.jmax; ++j)
	// 	for (int i = 0; i <= geometric.imax; ++i)
	// 	{
	// 		cv(i, j).rho = 1.0;
	// 		cv(i, j).rhou = 100.0;
	// 		cv(i, j).rhov = 400.0;
	// 		cv(i, j).rhoE = 40000.0;
	// 	}
	// for (int j = 2; j <= geometric.j2; ++j)
	// 	for (int i = 2; i <= geometric.i2; ++i)
	// 	{
	// 		cv(i, j).rho = 20.0;
	// 		cv(i, j).rhou = 300.0;
	// 		cv(i, j).rhov = 200.0;
	// 		cv(i, j).rhoE = 9.0E+4;
	// 	}
	// flow.DependentVarsAll();

		
	// int iter{0};
	// do
	// {
	// 	iter++;
	// 	tadv.cvOld = tadv.cv;
	// 	// printArray(cout, cv, "  cv =  ");
	// 	tadv.TimeStep(); // 没问题
	// 	// printCheck(checktime, tadv.tstep,
	// 	// 		   2, geometric.i2, 2, geometric.j2);
	// 	// cout << "\ntstep(4,4) = " << tstep(4, 4) << endl;
	// 	real_t fac, adtv;
	// 	for (int stage = 0; stage < 1; ++stage)
	// 	{
	// 		// cout << "\nstage = " << stage << endl;
	// 		tadv.spaceDiscrt.SetDissipationZero();

	// 		tadv.spaceDiscrt.DissipRoe1();  // 可以
	// 		// printCheck(checkdiss, tadv.spaceDiscrt.diss,
	// 		// 	   2, geometric.i2, 2, geometric.j2);
	// 		tadv.spaceDiscrt.SetDissipationZero();			
	// 		tadv.spaceDiscrt.FluxRoe1();  // 可以
	// 		printCheck(checkfluxroe1, tadv.rhs,
	// 			   2, geometric.i2, 2, geometric.j2);


	// 		// cfl 在计算时间时已经加进去了
	// 		fac = tadv.ark[stage] * tadv.cflNum;
	// 		for (int j = 2; j <= tadv.j2; ++j)
	// 		{
	// 			for (int i = 2; i <= tadv.i2; ++i)
	// 			{
	// 				adtv = fac * tadv.tstep(i, j) / tadv.vol(i, j);
	// 				tadv.rhs(i, j).rho *= adtv;
	// 				tadv.rhs(i, j).rhou *= adtv;
	// 				tadv.rhs(i, j).rhov *= adtv;
	// 				tadv.rhs(i, j).rhoE *= adtv;
	// 			}
	// 		}
	// 		// implicit residual smoothing   all smoothing
	// 		// 有待添加

	// 		// update - new solution, new dependent variables
	// 		for (int j = 2; j <= tadv.j2; ++j)
	// 		{
	// 			for (int i = 2; i <= tadv.i2; ++i)
	// 			{
	// 				tadv.cv(i, j).rho = tadv.cvOld(i, j).rho - tadv.rhs(i, j).rho;
	// 				tadv.cv(i, j).rhou = tadv.cvOld(i, j).rhou - tadv.rhs(i, j).rhou;
	// 				tadv.cv(i, j).rhov = tadv.cvOld(i, j).rhov - tadv.rhs(i, j).rhov;
	// 				tadv.cv(i, j).rhoE = tadv.cvOld(i, j).rhoE - tadv.rhs(i, j).rhoE;
	// 			}
	// 		}

	// 		tadv.flows.DependentVarsAll();
	// 		// printArray(cout, cv, "before boundary conditions cv");
	// 		boundary.BoundaryConditions();
	// 	} // end irk
	// } while (iter < 1);

	//     cout << "\nokay4\n"
	//          << endl;
	// tadv.SolveOneStep();
	// Solver flowSolver(cfg, tadv);
	// flowSolver.FlowSolver();

	return 0;
}
